NW54 - Open Transport ÉGÉâÅ[ -3151 Ç®ÇÊÇ— -3160 ÇΔ Option Management

(98 îN 4 åé 24 ì˙)

Q: OptionManagement ä÷êîÇ≈ÉGÉìÉhÉ|ÉCÉìÉgÇÃÉIÉvÉVÉáÉìÇê›íËǵÇÊǧÇΔÇ∑ÇÈÇΔÅAÉGÉâÅ[-3151 (ïsê≥Ç»ÉIÉvÉVÉáÉì) Ç‹ÇΩÇÕ ÉGÉâÅ[ -3160 (ÉoÉbÉtÉ@ÉIÅ[ÉoÅ[ÉtÉçÅ[) ÇÃÇ¢Ç∏ÇÍÇ©ÇÃÉGÉâÅ[ÉÅÉbÉZÅ[ÉWÇ™í ímÇ≥ÇÍÇ‹Ç∑ÅBDZÇÃÉGÉâÅ[ÇâåàÇ∑ÇÈÇ…ÇÕâΩÇí≤Ç◊ÇΩÇÁÇÊÇ¢Ç≈ǵÇÂǧǩÅB

A: ÉGÉâÅ[ -3151 ÇÕ Open Transport ÇÃÉGÉìÉhÉ|ÉCÉìÉgÇ…ëŒÇµÇƒïsê≥Ç»ÉIÉvÉVÉáÉìÇ‹ÇΩÇÕïsê≥Ç»ÉIÉvÉVÉáÉìílÇ™ìnÇ≥ÇÍÇΩDZÇΔÇé¶ÇµÇ‹Ç∑ÅBà»â∫ÇÃâÒìöÇÕOTOptionManagement ÇÃíméØÇëOíÒÇΔǵǃǢNjÇ∑ÅBOTOptionManagementä÷êîÇÃè⁄ç◊DžǬǢǃÇÕÅAÅwInside Macintosh: Networking With Open TransportÅxÇÃëÊ 7 èÕÅuOption ManagementÅvÇéQèΔǵǃÇ≠ÇæÇ≥Ç¢ÅBDZÇÃÉhÉLÉÖÉÅÉìÉgÇÕ Open Transport Çà Web ÉyÅ[ÉWÇ©ÇÁÉ_ÉEÉìÉçÅ[ÉhÇ∑ÇÈDZÇΔÇ™Ç≈Ç´Ç‹Ç∑ÅB

ÉGÉâÅ[ -3151 ÇÃàÍî ìIÇ»å¥àˆÇÕéüÇÃí ÇËÇ≈Ç∑ÅB

1. ÉIÉvÉVÉáÉìÇÃí∑Ç≥Ç™ê≥ǵÇ≠džÇËÇ‹ÇπÇÒÅBOpen Transport Çà Option Management ÉIÉvÉVÉáÉìÇÃílÇÃí∑Ç≥ÇÕÇŸÇΔÇÒÇ« 4 ÉoÉCÉgÇ≈Ç∑ÅBǵǩǵÅAï∂éöóÒÇ‚ç\ë¢ëÃÇÃílÇéÊÇÈÉIÉvÉVÉáÉìLJdžÇËÇ‹Ç∑ÅBTOptMgmt Çà opt.len ÉtÉBÅ[ÉãÉhÇΔ TOptionHeader Çà len ÇÃóºï˚ÇÉIÉvÉVÉáÉìóvãÅÉoÉbÉtÉ@ÇÃí∑Ç≥Ç…ê≥ǵÇ≠ê›íËÇµÇ»ÇØÇÍnjǻÇËÇ‹ÇπÇÒÅBDZÇÃÉoÉbÉtÉ@ÇΔ TOptMgmt ç\ë¢ëÃÇÕÅAOption Management Ç©ÇÁÇÃâûìöÇéÛÇØéÊÇÈÇΩÇflDžLJégópÇ∑ÇÈDZÇΔÇ™Ç≈Ç´Ç‹Ç∑Ç™ÅAǪÇÍDžǬǢǃÇÕéüÇÃÉGÉâÅ[-3160 ÇÃê‡ñæÇÃǻǩÇ≈êGÇÍÇ‹Ç∑ÅB

ÉGÉâÅ[ -3151 Ç™ç≈LJî≠ê∂Ç∑ÇÈÇÃÇÕÅAÉIÉvÉVÉáÉìÇÃílÇ™ 1 ÉoÉCÉgÇ»ÇÃÇ…ÅA4 ÉoÉCÉgÇÃí∑Ç≥Ç™éwíËÇ≥ÇÍǃǢÇÈèÍçáÇ≈Ç∑ÅBDZDZÇ≈LJìØólÇ…ÅAí∑Ç≥ÇÃà¯êîÇÕ TOptMgmt ç\ë¢ëÃÇΔ TOptionHeader ç\ë¢ëÃÇà 2 â”èäÇ…ê›íËÇµÇ»ÇØÇÍnjǻÇËÇ‹ÇπÇÒÅB

2. OTOptionManagement ä÷êîÇ≈âûìöÇéÛÇØéÊÇÈ TOptMgmt É|ÉCÉìÉ^ÇìnǵǃǢÇÈÇÃÇ…ÅAmaxlen ÉtÉBÅ[ÉãÉhÇ™ê≥ǵÇ≠ê›íËÇ≥ÇÍǃǢNjÇπÇÒÅBDZÇÃÉpÉâÉÅÅ[É^Çê›íËǵǻǢÇΔÅAì¸óÕílÇ…ÇÊǡǃÇÕÅAÉGÉâÅ[ -3160 Ç™î≠ê∂ǵNjÇ∑ÅBÅuOpenTransport SDKÅvÇà OTMultiCastPitch ÉRÅ[ÉhÇÃÉTÉìÉvÉãÇ≈LJÅAIP_ADD_MEMBERSHIP ÉIÉvÉVÉáÉìÇê›íËÇ∑ÇÈâ”èäÇ≈DZÇÃñ‚ëËÇ™î≠ê∂ǵNjÇ∑ÅBê≥ǵǢåƒÇ—èoǵÇÕà»â∫ÇÃí ÇËÇ≈Ç∑ÅB

        optReq.flags = T_NEGOTIATE;
        optReq.opt.len = sizeof(optBuffer);     // ÉoÉbÉtÉ@ÇÃÉTÉCÉYÇéwíË
        optReq.opt.maxlen = sizeof(optBuffer);  // <--- DZÇÃçsÇÃÉRÅ[ÉhÇí«â¡
        optReq.opt.buf = (UInt8*) optBuffer;
        OTMemzero(optBuffer, sizeof(optBuffer));
        opt->level = INET_IP;
        opt->name = IP_ADD_MEMBERSHIP;
        opt->len = sizeof(optBuffer);           // ÉIÉvÉVÉáÉìÇÃÉTÉCÉYÇéwíË

ìØÇ∂ÉRÅ[ÉhÉTÉìÉvÉãÇ≈ÅAIP_MULTICAST_TTL ÉIÉvÉVÉáÉìÇê›íËÇ∑ÇÈâ”èäÇ≈LJÅAìØólÇÃèCê≥Ç™ïKóvÇ≈Ç∑ÅBdžÇΔÇ≈ïœçXçœÇ›ÇÃÉTÉìÉvÉãÉRÅ[ÉhÇåfç⁄ǵNjÇ∑ÅB

è„ãLÇÃèCê≥ÇÕÅuOpen Transport SDK v1.3Åvà»ëOÇÃèÍçáÇ…äYìñǵNjÇ∑ÅB

3. Open Transport v1.3 à»ëOÇÃÉoÅ[ÉWÉáÉìÇégópÇ∑ÇÈç€Ç…ä˘ímÇÃñ‚ëËǙdžÇËÇ‹Ç∑ÅBOTOptionManagement ä÷êîÇ≈ T_ALLOPT Çégǡǃåªç›Çà IP ÉIÉvÉVÉáÉìê›íËÇ∑Ç◊ǃÇàÍìxÇÃåƒÇ—èoǵÇ≈éÊìæÇµÇÊǧÇΔÇ∑ÇÈÇΔÅADZÇÃÉGÉâÅ[Ç™î≠ê∂ǵNjÇ∑ÅBDZÇÃñ‚ëËÇÕÅAOTMulticastPitchSample ÇÃÉRÅ[ÉhÇ Open Transport v1.3 à»ëOÇ≈ìÆçÏÇ≥ÇπÇÈÇΔî≠ê∂ǵNjÇ∑ÅBâÒîï˚ñ@ÇÕÅAåªç›ÅAílÇ™ímÇËÇΩÇ¢ÉIÉvÉVÉáÉìÇæÇØÇå¬ï Ç…í≤Ç◊ÇÈDZÇΔÇ≈Ç∑ÅB

ÉGÉâÅ[ -3160 ÇÃàÍî ìIÇ»å¥àˆÇÕéüÇÃí ÇËÇ≈Ç∑ÅB

1. TOptMgmt Çà opt.maxlen Ç™èâä˙âªÇ≥ÇÍǃǢǻǢǩÅAílÇ™ê≥ǵÇ≠džÇËÇ‹ÇπÇÒÅBDZÇÃÉGÉâÅ[ÇÕÅAÉIÉvÉVÉáÉìÇÃÉlÉSÉVÉGÅ[ÉgÇ™ê¨å˜ÇµÇΩèÍçáÇ≈LJï‘Ç≥ÇÍÇÈDZÇΔǙdžÇËÇ‹Ç∑ÅBâåàï˚ñ@ÇÕÅAmaxlen ÉtÉBÅ[ÉãÉhÇê≥ǵÇ≠ê›íËÇ∑ÇÈDZÇΔÇ≈Ç∑ÅB

2. Open Transport v1.3 à»ëOÇÃÉoÅ[ÉWÉáÉìÇégópÇ∑ÇÈç€Ç…ä˘ímÇÃñ‚ëËǙdžÇËÇ‹Ç∑ÅBí∑Ç≥Ç™ 1 ÉoÉCÉgÇ© 2 ÉoÉCÉgÇà TCP/IP ÉIÉvÉVÉáÉìÇÃÉlÉSÉVÉGÅ[ÉgÇ≈ÅAâûìöÉoÉbÉtÉ@ÇÃí∑Ç≥Ç 4 ÉoÉCÉgÇÊÇËè¨Ç≥Ç¢ílÇ…ê›íËÇ∑ÇÈÇΔÅAOpen Transport ÇÕDZÇÃÉGÉâÅ[Çï‘ǵNjÇ∑ÅBǮLJǵÇÎǢDZÇΔÇ…ÅAÉIÉvÉVÉáÉìÇÃÉlÉSÉVÉGÅ[Égé©ëÃÇÕê¨å˜Ç∑ÇÈèÍçáǙdžÇËÇ‹Ç∑ÅBDZÇÃñ‚ëËÇâÒîÇ∑ÇÈÇ…ÇÕÅAÉoÉbÉtÉ@ÉTÉCÉYÇÕ kOTFourByteOptionSize Ç…íËã`ǵíºÇµÅA2 ǬÇà len ÉtÉBÅ[ÉãÉhÇÕ kOTOneByteOptionSize Ç‹ÇΩÇÕ kOTTwoByteOptionSize ÇÃNjNjÇ≈ê›íËÇ∑ÇÈDZÇΔÇ≈Ç∑ (DZÇÍÇèëǢǃǢÇÈéûì_Ç≈ÇÕÅA2 ÉoÉCÉgÇÃÉIÉvÉVÉáÉìê›íËÇÕdžÇËÇ‹ÇπÇÒ) ÅB

âûìöÉpÉâÉÅÅ[É^Ç™éwíËÇ≥ÇÍǃǢǻǢÇΔÅAÉGÉâÅ[ -3160 ÇÕï‘Ç≥ÇÍÇ‹ÇπÇÒÅBàÍï˚ÅAï‘ÇËílÇÉ`ÉFÉbÉNǵǻǢÇΔÅAÉIÉvÉVÉáÉìê›íËÇÃåƒÇ—èoǵÇÃÉXÉeÅ[É^ÉXÇ™ T_SUCCESS ǩǫǧǩí≤Ç◊ÇÈDZÇΔÇ™Ç≈Ç´Ç‹ÇπÇÒÅBDZÇÃñ‚ëËÇÕÅAéüÇÃÉIÉvÉVÉáÉìÇê›íËǵÇÊǧÇΔÇ∑ÇÈèÍçáÇ…î≠ê∂ǵNjÇ∑ÅB

ÉIÉvÉVÉáÉìÉåÉxÉã ÉIÉvÉVÉáÉìñº
INET_UDP UDP_RX_ICMP
INET_IP IP_RECVOPTS
INET_IP IP_TOS
INET_IP IP_TTL
INET_IP IP_MULTICAST_LOOP
INET_IP IP_MULTICAST_TTL
INET_IP IP_RECVDSTADDR
INET_IP IP_RECVIFADDR


OTMultiCastPitchSample.cp ÉtÉ@ÉCÉãÇÃïœçXÇΔèCê≥Ç≈Ç∑ÅB

èCê≥ 1: IP_MULTICAST_TTL ÉIÉvÉVÉáÉìê›íËÇÃÇΩÇflÇÃÉTÉìÉvÉãÉRÅ[ÉhÇÃïœçX

        //
        //  É}ÉãÉ`ÉLÉÉÉXÉgëóêMÇà Time-to-live ÇÃílÇÃê›íË (ÉfÉtÉHÉãÉgÇÕ 1)
        //  TOptMgmt ÇÕçƒóòópÇ≈Ç´ÇÈÇ™ÅAOption é©ëÃÇÕï ÅB
        //  è„ÇÃÉoÉbÉtÉ@ÇÕçƒóòópâ¬î\ÇæÇ™ÅAê≥ämÇä˙Ç∑ÇΩÇflê≥ǵǢï˚ñ@ÇéÊÇÈÅB
        //

        UInt8    ttlOptBuffer[ kOTFourByteOptionSize ]; // <-- 4 ÉoÉCÉgí∑ÇÃÉIÉvÉVÉáÉìÉoÉbÉtÉ@

TOption* ttlOpt = (TOption*)ttlOptBuffer; optReq.flags = T_NEGOTIATE; optReq.opt.len = kOTOneByteOptionSize; // <-- ÉIÉvÉVÉáÉìí∑ÇÕ 1 ÉoÉCÉgÇÃNjNj optReq.opt.maxlen = sizeof(ttlOptBuffer); // <-- âûìöÉoÉbÉtÉ@ÇÃç≈ëÂí∑Çê›íË optReq.opt.buf = (UInt8*) ttlOptBuffer; OTMemzero(optBuffer, sizeof(ttlOptBuffer)); ttlOpt->level = INET_IP; ttlOpt->name = IP_MULTICAST_TTL; ttlOpt->len = kOTOneByteOptionSize; // <-- ÉIÉvÉVÉáÉìí∑ÇÕ 1 ÉoÉCÉgÇÃNjNj *(char*)(ttlOpt->value) = kDefaultTTL; err = gEndpt->OptionManagement(&optReq, &optReq);
èCê≥ 2: IP_MULTICAST_LOOP ÉIÉvÉVÉáÉìÇê›íËÇ∑ÇÈÉTÉìÉvÉãÉRÅ[ÉhÇÃïœçX

    //
    //  ÉãÅ[ÉvÉoÉbÉNÇÉIÉtÇ…Ç∑ÇÈ - é©ï™Ç≈ëóêMǵÇΩÉpÉPÉbÉgÇéÛÇØéÊÇËÇΩÇ¢èÍçáÇÕÉIÉtDžǵǻǢ
    //

    TOptMgmt    optReq;
    UInt8       optBuffer[ kOTFourByteOptionSize ];   // <-- 4 ÉoÉCÉgí∑ÇÃÉIÉvÉVÉáÉìÉoÉbÉtÉ@
    TOption*    opt = (TOption*)optBuffer;

    OTMemzero(optBuffer, sizeof(optBuffer));
    optReq.flags    = T_NEGOTIATE;
    optReq.opt.len  = kOTOneByteOptionSize;           // <-- ÉIÉvÉVÉáÉìí∑ÇÕ 1 ÉoÉCÉgÇÃNjNj

optReq.opt.maxlen = sizeof(optBuffer); // <-- âûìöÉoÉbÉtÉ@ÇÃç≈ëÂí∑Çê›íËÇ∑ÇÈ optReq.opt.buf = (UInt8*) optBuffer; opt->level = INET_IP; opt->name = IP_MULTICAST_LOOP; opt->len = kOTOneByteOptionSize; // <-- ÉIÉvÉVÉáÉìí∑ÇÕ 1 ÉoÉCÉgÇÃNjNj *(char *)(opt->value) = gLoopbackState; err = gEndpt->OptionManagement(&optReq, &optReq);

-- Rich Kubota
devsupport@apple.com


[ Technical Q&A's : Communications & Collaboration : Networking : NW54 ]